package com.shujia.spark

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

object Demo14Action {
  def main(args: Array[String]): Unit = {

    val conf: SparkConf = new SparkConf()
      .setMaster("local")
      .setAppName("map")


    val sc = new SparkContext(conf)

    val rdd1: RDD[String] = sc.textFile("spark/data/students.txt")

    /**
      * count: 统计rdd的行数
      * 会触发任务执行
      *
      */

    println(rdd1.count())

    /**
      * foreach:遍历数据,一般只能用于本地测试
      * foreachPartition： 一次处理一个分区的数据， 很一般用于将数据保存到外部数据额时候
      */

    rdd1.foreach(println)


    rdd1.foreachPartition(iter => {
      println("一个分区")
      iter.foreach(println)
    })


    /**
      * collect: 将rdd转换成集合，将rdd的数据拉取到内存中，如果rdd数据量比较大会导致内存溢出
      *
      */

    val array: Array[String] = rdd1.collect()


    println(array)


    /**
      *
      * reduce: 全局聚合
      *
      * select sum(age) from student
      *
      */

    val ages: RDD[Int] = rdd1.map(line => line.split(",")(2).toInt)

    val sumAge: Int = ages.reduce((x, y) => x + y)

    println(sumAge)


    /**
      * save:将数据保存到hdfs中，如果输出目录已存在会报错
      *
      */

    rdd1.saveAsTextFile("spark/data/out1")


    while (true) {

    }

  }

}
